# 导入tkinter图形界面库的所有内容
from tkinter import *
# 导入time模块，用于处理时间
import time


class 秒表(Frame):
    '''实现一个秒表部件'''
    # 设置刷新时间间隔为50毫秒
    刷新间隔 = 50
    #**
    def __init__(self, 父窗口=None, **参数):
        # 初始化Frame父类
        Frame.__init__(self, 父窗口, 参数)
        # 初始化开始时间为0
        self.开始时间 = 0.0
        # 初始化已经过的时间为0
        self.已过时间 = 0.0
        # 初始化运行状态为False
        self.正在运行 = False
        # 创建一个StringVar对象用于显示时间
        self.时间文本 = StringVar()
        # 调用创建组件方法
        self.创建组件()
        # 设置首次运行标志
        self.首次运行 = True

    def 创建组件(self):
        '''制作时间标签'''
        # 创建一个标签用于显示时间，使用时间文本变量
        标签 = Label(self, textvariable=self.时间文本, justify=LEFT)
        # 初始化时间显示
        self.设置时间显示(self.已过时间)
        # 设置标签的布局，填充X方向，不扩展，上下左右留出2像素间距
        标签.pack(fill=X, expand=NO, pady=2, padx=2)

    def 更新时间(self):
        '''更新显示的时间'''
        # 计算已经过的时间
        self.已过时间 = time.time() - self.开始时间
        # 更新时间显示
        self.设置时间显示(self.已过时间)
        # 设置定时器，每隔刷新间隔毫秒调用一次更新时间方法
        self.定时器 = self.after(self.刷新间隔, self.更新时间)

    def 设置时间显示(self, 时间值):
        '''将时间格式改为 分：秒：百分秒'''
        # 计算分钟数
        分钟 = int(时间值 / 60)
        # 计算秒数
        秒 = int(时间值 - 分钟 * 60.0)
        # 计算百分秒
        百分秒 = int((时间值 - 分钟 * 60.0 - 秒) * 100)
        # 设置时间显示文本，格式为XX:XX:XX
        self.时间文本.set(f'{分钟:02d}:{秒:02d}:{百分秒:02d}')

    def 开始(self):
        '''开始计时'''
        # 如果秒表未在运行
        if not self.正在运行:
            # 设置开始时间
            self.开始时间 = time.time() - self.已过时间
            # 开始更新时间
            self.更新时间()
            # 设置运行状态为True
            self.正在运行 = True

    def 停止(self):
        '''停止秒表'''
        # 如果秒表正在运行
        if self.正在运行:
            # 取消定时器
            self.after_cancel(self.定时器)
            # 计算已经过的时间
            self.已过时间 = time.time() - self.开始时间
            # 更新时间显示
            self.设置时间显示(self.已过时间)
            # 设置运行状态为False
            self.正在运行 = False

    def 重置(self):
        '''重设秒表'''
        # 重置开始时间为当前时间
        self.开始时间 = time.time()
        # 重置已过时间为0
        self.已过时间 = 0.0
        # 更新时间显示
        self.设置时间显示(self.已过时间)

    def 显示秒表(self):
        '''显示秒表界面'''
        # 如果是首次运行
        if self.首次运行:
            # 将秒表放在顶部
            self.pack(side=TOP)
            # 创建开始按钮并放在左边
            Button(self, text='开始', command=self.开始).pack(side=LEFT)
            # 创建停止按钮并放在左边
            Button(self, text='停止', command=self.停止).pack(side=LEFT)
            # 创建重置按钮并放在左边
            Button(self, text='重置', command=self.重置).pack(side=LEFT)
            # 创建退出按钮并放在左边
            Button(self, text='退出', command=self.quit).pack(side=LEFT)
        # 设置首次运行标志为False
        self.首次运行 = False


# 如果是直接运行此文件
if __name__ == '__main__':
    def 主函数():
        # 创建主窗口
        根窗口 = Tk()
        # 设置窗口标题
        根窗口.title('秒表计时器')
        # 设置窗口大小
        根窗口.geometry('190x80')
        # 创建秒表实例
        秒表实例 = 秒表(根窗口)
        # 显示秒表
        秒表实例.显示秒表()
        # 启动主循环
        根窗口.mainloop()
    # 调用主函数
    主函数()
